package com.bwie.cart.sync;

import com.alibaba.fastjson2.JSONObject;
import com.bwie.cart.domain.po.CartItemPO;
import com.bwie.cart.domain.po.CartPO;
import com.bwie.cart.domain.vo.CartItemVO;
import com.bwie.cart.domain.vo.CartVO;
import com.bwie.cart.mapper.CartClientMapper;
import com.bwie.cart.mapper.CartItemClientMapper;
import com.bwie.common.redis.service.RedisService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.Collection;
import java.util.List;
import java.util.Map;

@Component
public class CartSync {
    @Autowired
    private RedisService redisService;

    @Autowired
    private CartItemClientMapper cartItemMapper;

    @Autowired
    private CartClientMapper cartClientMapper;

    @Scheduled(cron = "0/5 * * * * *")
    public void synchronousCardItem(){
        //从redis中获取所有前缀为CART_MAP:的信息
        Collection<String> cartKeys = redisService.keys("CART:*");

        //清除购物车详情
        cartItemMapper.clearAll();

        for (String cartKey : cartKeys) {
            Map<String, Object> cacheMap = redisService.getCacheMap(cartKey);
            Collection<Object> values = cacheMap.values();
            for (Object value : values) {
                String cartItemVoJson = JSONObject.toJSONString(value);
                CartItemVO cartItemVo = JSONObject.parseObject(cartItemVoJson, CartItemVO.class);
                CartItemPO cartItem = new CartItemPO();
                BeanUtils.copyProperties(cartItemVo,cartItem);
                cartItemMapper.insertCartItem(cartItem);
            }
        }

        //获取所有购物车信息
        CartPO cartPO = new CartPO();
        List<CartVO> cartVOS = cartClientMapper.selectCartList(cartPO);

        //不为空查询购物车详情信息
        if (!CollectionUtils.isEmpty(cartVOS)){
            for (CartVO cartVO : cartVOS) {
                CartItemPO cartItemPO = new CartItemPO();
                cartItemPO.setCartId(cartVO.getId());
                List<CartItemPO> cartItemPOS = cartItemMapper.selectCartItemList(cartItemPO);
                //详情信息为空删除该购物车信息
                if (CollectionUtils.isEmpty(cartItemPOS)){
                    cartClientMapper.deleteCartById(cartVO.getId());
                }
            }
        }

    }
}
